package org.jsola.hr.helper;

import org.jsola.common.DateKit;
import org.jsola.hr.dto.EmpDepAddDTO;
import org.jsola.hr.dto.EmpDepUpdateDTO;
import org.jsola.hr.entity.EmpDepDO;
import org.jsola.hr.query.EmpDepQuery;
import org.jsola.hr.service.IEmpDepService;
import org.jsola.hr.vo.CompanyVO;
import org.jsola.hr.vo.DepInfoVO;
import org.jsola.hr.vo.EmpDepVO;
import org.jsola.hr.vo.EmpInfoVO;
import org.jsola.module.ModuleContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;

import java.util.*;

import static org.jsola.hr.core.AbstractTest.SITE_ID;
import static org.jsola.hr.core.TestCommonConstans.*;


/**
 * @author zhr
 */
@Component
public class EmpDepTestHelper extends BaseTestHelper {
    
    @Autowired
    private DepInfoTestHelper depInfoTestHelper;
    @Autowired
    private EmpInfoTestHelper empInfoTestHelper;
    @Autowired
    private IEmpDepService empDepService;

    /**
     * 生成add测试数据
     * @return EmpDepAddDTO
     */
    public EmpDepAddDTO getEmpDepAddDTO(){
        EmpDepAddDTO empDepAddDTO = new EmpDepAddDTO();
        empDepAddDTO.setEmpId(empInfoTestHelper.saveEmpInfoExample().getId());
        empDepAddDTO.setDepId(depInfoTestHelper.saveDepInfoExample().getId());
        empDepAddDTO.setCompanyId(getRandomValue("varchar",32));
        return empDepAddDTO;
    }


    /**
     * 生成update测试数据
     * @return EmpDepUpdateDTO
     */
    public EmpDepUpdateDTO getEmpDepUpdateDTO(EmpDepVO empDepVO){
        return empDepService.selectDOById(empDepVO.getId(), SITE_ID).to(EmpDepUpdateDTO.class);
    }

    /**
     * 生成查询数据
     * @return EmpDepQuery
     */
    public EmpDepQuery getEmpDepQuery() {
        EmpDepQuery empDepQuery = new EmpDepQuery();
        List<EmpDepDO> empDepDOList = empDepService.list(new EmpDepDO(),SITE_ID);
        if (!CollectionUtils.isEmpty(empDepDOList)) {
            EmpDepDO empDepDO = empDepDOList.get(0);
            empDepQuery = empDepDO.to(EmpDepQuery.class);
            if (empDepDO.getGmtCreate() != null) {
                empDepQuery.setGmtCreateStart(DateKit.getBeforeDay(empDepDO.getGmtCreate(),-1));
                empDepQuery.setGmtCreateEnd(DateKit.getBeforeDay(empDepDO.getGmtCreate(),1));
            }
        }
        return empDepQuery;
    }

    /**
     * 保存示例
     * @return EmpDepVO
     */
    public EmpDepVO saveEmpDepExample(){
        EmpDepAddDTO addDTO = this.getEmpDepAddDTO();
        EmpDepVO empDepVO = empDepService.save(addDTO,buildTokenUser());
        return empDepVO;
    }

    /**
     * 批量部门添加用户
     *
     * @param moduleContext 上下文
     */
    public void batchSaveEmpDepExample(ModuleContext moduleContext) {
        // 创建公司,及公司下部门
        depInfoTestHelper.batchSaveDepInfoExample(moduleContext);
        List<DepInfoVO> depList = moduleContext.get(CODE_DEP_LIST);
        CompanyVO companyVO = moduleContext.get(CODE_COMPANY);

        Map<String, List<EmpInfoVO>> depUserMap = new HashMap<>();
        List<EmpInfoVO> allEmpList = new ArrayList<>();


        // 聘用形式（0：非正式，1：正式）
        int[] employTypes = {0, 1};
        // 非正式类型（1：实习，2：劳务，3：雇佣，4：返聘，5：外包）
        int[] informalTypes = {1, 2, 3, 4, 5};
        // 正式类型（1：试用期，2：已转正）
        int[] formalTypes = {1, 2};
        // 合同状态（1：未签约，2：已签约，3：已到期）
        int[] contractsStatus = {1, 2, 3};
        // 员工状态（1：待入职，2：入职，3：待离职，4：离职）
        int[] empStatus = {1, 2, 3};

        // 放几个多部门的员工
        EmpInfoVO empInfoLast = null;
        // -2,最后一个部门不放人员,只有前几个放
        for (int i = 0; i < depList.size() - 1; i++) {
            DepInfoVO depInfo = depList.get(i);

            List<EmpInfoVO> empInfoList = new ArrayList<>();
            if (!Objects.isNull(empInfoLast)) {
                buildAndSaveEmpDepAddDTO(depInfo.getId(), empInfoLast.getId(), companyVO.getId());
                empInfoList.add(empInfoLast);
            }

            int j = 0;
            // 聘用形式
            for (int employType : employTypes) {
                // 合同状态
                for (int contractsStatu : contractsStatus) {
                    // 员工状态
                    for (int empStatu : empStatus) {
                        // 非正式类型
                        if (employType == 0) {
                            for (int informalType : informalTypes) {
                                EmpInfoVO empInfo = empInfoTestHelper.saveEmpInfoExample(companyVO.getId(), employType, contractsStatu, empStatu, informalType, 0);
                                buildAndSaveEmpDepAddDTO(depInfo.getId(), empInfo.getId(), companyVO.getId());
                                empInfoList.add(empInfo);
                                allEmpList.add(empInfo);
                                if (j == 0) {
                                    empInfoLast = empInfo;
                                }
                                j++;
                            }
                        }
                        // 正式类型
                        if (employType == 1) {
                            for (int formalType : formalTypes) {
                                EmpInfoVO empInfo = empInfoTestHelper.saveEmpInfoExample(companyVO.getId(), employType, contractsStatu, empStatu, 0, formalType);
                                buildAndSaveEmpDepAddDTO(depInfo.getId(), empInfo.getId(), companyVO.getId());
                                empInfoList.add(empInfo);
                                allEmpList.add(empInfo);
                                if (j == 0) {
                                    empInfoLast = empInfo;
                                }
                                j++;
                            }
                        }
                    }
                }
            }

            depUserMap.put(depInfo.getId(), empInfoList);
        }
        // 几个没有部门的用户
        List<EmpInfoVO> noDepEmpList = new ArrayList<>();
        for (int j = 0; j < 5; j++) {
            EmpInfoVO empInfo = empInfoTestHelper.saveEmpInfoExample(companyVO.getId());
            allEmpList.add(empInfo);
            noDepEmpList.add(empInfo);
        }
        // 全部员工
        moduleContext.add(CODE_EMP_LIST, allEmpList);
        // 没有部门的员工
        moduleContext.add(CODE_EMP_LIST_NO_DEP, noDepEmpList);
        // 部门及部门下用户
        moduleContext.add(CODE_DEP_EMP_MAP, depUserMap);
    }


    /**
     * 构建部门员工关系实体
     *
     * @param empId     员工id
     * @param depId     部门id
     * @param companyId 公司id
     */
    private void buildAndSaveEmpDepAddDTO(String depId, String empId, String companyId) {
        EmpDepAddDTO empDepAddDTO = new EmpDepAddDTO();
        empDepAddDTO.setEmpId(empId);
        empDepAddDTO.setDepId(depId);
        empDepAddDTO.setCompanyId(companyId);

        empDepService.save(empDepAddDTO, buildTokenUser());
    }
}

